package com.wuzhazha.javamind.chapter15.test03;

/**
 * 自己创建一个模拟LinkedList的链式堆栈（对比LinkedStack，移除了内部类Node的类型参数U）
 * @param <T>
 */
public class LinkedStack2<T> {

    //移除了static修饰，因为静态内部类无法访问非静态的外部类成员
    private class Node{
        //节点内容，U是节点内容的参数类型
        T item;
        //存放下一个节点对象
        Node next;

        /**
         * 默认构造
         */
        Node(){
            this.item = null;
            this.next = null;
        }

        /**
         * 构造一个新节点
         * @param item 节点内容
         * @param next 下一个节点
         */
        Node(T item,Node next){
            this.item = item;
            this.next = next;
        }

        /**
         * 判断该节点为空（有效）
         * @return
         */
        boolean end(){
            return item == null && next == null;//末端哨兵，用于判断是否到底
        }
    }

    private Node top = new Node();

    /**
     * 入栈
     * @param item
     */
    public void push(T item){
        top = new Node(item,top);//创建一个新的节点于栈顶，同时原来的栈顶节点就成为了下一个节点
    }

    /**
     * 出栈
     * @return
     */
    public T pop(){
        T result = top.item;
        if(!top.end()){//还未到栈底
            top = top.next;
        }
        return result;
    }

}
